package cn.rkylin.oms.goods.service;

import java.util.List;
import java.util.Map;

import com.github.pagehelper.PageInfo;

import cn.rkylin.core.ApolloMap;
import cn.rkylin.oms.goods.domain.GoodsSku;
import cn.rkylin.oms.goods.domain.SkuStock;
import cn.rkylin.oms.goods.vo.CategoryActionVO;
import cn.rkylin.oms.goods.vo.GoodsInfoVO;
import cn.rkylin.oms.goods.vo.GoodsSkuVO;
import cn.rkylin.oms.goods.vo.GoodsVO;
import cn.rkylin.oms.goods.vo.PrjSkuVO;
import cn.rkylin.oms.goods.vo.SkuStockVO;

/**
 * 系统商品服务层接口
 *
 * @author wangxing
 * @version 1.0.0
 * @created 2017-7-5
 */
public interface IGoodsService {

    /**
     * 根据条件取得数量
     * @param params
     * @return
     * @throws Exception
     */
    public int selectCount(Map<String,Object> params) throws Exception;
    /**
     * 系统商品以及规格数据处理。
     *
     * @param goodsInfo
     * @return
     * @throws Exception
     */
    public Map<String, Object> modifyGoodsData(GoodsInfoVO goodsInfo, Map<String, String> map) throws Exception;

    /**
     * 批量处理商品分类
     *
     * @param categoryActionVO
     * @return
     * @throws Exception
     */
    public Map<String, Object> updateCategorybyGoodsIds(CategoryActionVO categoryActionVO) throws Exception;

    /**
     * 查询系统商品
     *
     * @param page
     * @param rows
     * @param goodsVO
     * @return
     * @throws Exception
     */
    public PageInfo<GoodsVO> findByWhere(int page, int rows, GoodsVO goodsVO) throws Exception;

    /**
     * 查询系统规格
     *
     * @param goodsSkuVO
     * @return
     * @throws Exception
     */
    public List<GoodsSkuVO> findByWhere(GoodsSkuVO goodsSkuVO) throws Exception;

    public PageInfo<GoodsSkuVO> findByWhere(int page, int length, GoodsSkuVO param) throws Exception;

    /**
     * 新增系统商品
     *
     * @param params
     * @return
     * @throws Exception
     */
    public int insertGoods(ApolloMap<String, Object> params) throws Exception;

    /**
     * 修改系统商品
     *
     * @param params
     * @return
     * @throws Exception
     */
    public int updateGoods(ApolloMap<String, Object> params) throws Exception;

    /**
     * 删除系统商品(逻辑删除)
     *
     * @param params
     * @return
     * @throws Exception
     */
    public int deleteGoods(ApolloMap<String, Object> params) throws Exception;

    /**
     * 新增系统规格
     *
     * @param params
     * @return
     * @throws Exception
     */
    public int insertGoodsSku(ApolloMap<String, Object> params) throws Exception;

    /**
     * 修改系统规格
     *
     * @param params
     * @return
     * @throws Exception
     */
    public int updateGoodsSku(ApolloMap<String, Object> params) throws Exception;

    /**
     * 删除系统规格(逻辑删除)
     *
     * @param params
     * @return
     * @throws Exception
     */
    public int deleteGoodsSku(ApolloMap<String, Object> params) throws Exception;

    /**
     * 根据系统商品Id取得所有的规格
     *
     * @param goodsId
     * @return
     * @throws Exception
     */
    public List<GoodsSkuVO> getGoodsSkuByGoodsId(String goodsId) throws Exception;

    /**
     * 根据系统商品Id取得系统商品
     *
     * @param goodsId
     * @return
     * @throws Exception
     */
    public GoodsVO getGoodsById(String goodsId) throws Exception;

    /**
     * getSkuStockList:根据条件值对象中的条件获取商品的仓库库存信息. <br/>
     *
     * @author zhanghao
     * @param skuStockVO
     * @return 仓库库存信息
     * @throws Exception
     * @since JDK 1.6
     */
    List<SkuStock> getSkuStockList(SkuStockVO skuStockVO) throws Exception;

    /**
     * 查询项目sku列表为采购入库单
     * 
     * @param prjSkuVO
     *            项目sku VO
     * @throws Exception
     *             异常
     */
    public List<PrjSkuVO> selectPrjSkuListForStockIn(PrjSkuVO prjSkuVO) throws Exception;

    /**
     * 查询仓库商品列表
     * 
     * @param skuStockVO
     *            仓库商品VO
     * @throws Exception
     *             异常
     */
    public List<SkuStockVO> selectStockSkuList(SkuStockVO skuStockVO) throws Exception;

    /**
     * 根据SkuId获取Sku
     * 
     * @param skuId
     * @return
     * @throws Exception
     */
    public GoodsSku getGoodsSkuBySkuId(String skuId) throws Exception;

    /**
     * 删除商品校验
     * 
     * @param skuId
     * @return
     * @throws Exception
     */
    public Map<String, String> checkDelSku(String skuId) throws Exception;

    /**
     * 删除系统规格
     * 
     * @param skuId
     * @throws Exception
     */
    public void deleteGoodsSku(String skuId) throws Exception;

    public Map<String,Object> downLoadGoods(String entId,String mdm_code) throws Exception;

    public Object receiveGoods(String json,String type, String entId) throws Exception;
    
    public List<PrjSkuVO> selectPrjSkuListForCainiao(PrjSkuVO prjSkuVO) throws Exception;
    
    /**
     * isGoodsSnOpen:序列号管理功能是否开启. <br/>
     *
     * @author zhanghao
     * @param goodsId   商品ID
     * @return
     * @throws Exception
     */
    String isGoodsSnOpen(String goodsId) throws Exception;
    
    /**
     * setGoodsIsSn:设置序列号管理功能. <br/>
     * 如果是关闭，则直接管理.<br/>
     * 如果是开启，则需要执行复杂的逻辑校验.<br/>
     * 校验逻辑较为复杂，有优化空间，最好别在循环中使用.<br/>
     *
     * @author zhanghao
     * @param goodsId   商品
     * @param isSn      是否开启的标识 y-开启；n-不开启
     * @return 更新信息
     * @throws Exception
     */
     void setGoodsIsSn(String goodsId,String isSn) throws Exception;

}
